#include <my_header.h>
// 在AB事件之外不使用sleep，使用条件变量，确保B一定在A完成之后运行。
/* Usage: ./7_条件变量 */
// 定义锁和条件变量
pthread_mutex_t lock;
pthread_cond_t cond;
int flag = 0;   // 标记有没有打印
void *threadFunc(void *arg)
{
    // 加锁
    pthread_mutex_lock(&lock);
    if(flag == 0)
    {
        pthread_cond_wait(&cond, &lock);
    }
    // 解锁
    pthread_mutex_unlock(&lock);

    // 条件变量等待
    printf("wait lock...\n");
    printf("Before B!\n");
    sleep(3);
    printf("After B \n");
    return NULL;
}
int main(void){                                  
    // 初始化条件变量并把锁传入
    // 传入条件变量的指针 要操作的锁
    pthread_mutex_init(&lock, NULL);
   
    // 定义锁
    pthread_cond_init(&cond, NULL);

        // 创建子线程
    pthread_t tid;
    int ret_create = pthread_create(&tid, NULL, threadFunc, NULL);
    THREAD_ERROR_CHECK(ret_create, "pthread_create");

    printf("Before A! \n");
    sleep(3);
    printf("After A \n"); 
      // 加锁
    pthread_mutex_lock(&lock);
    flag = 1;   // 已打印
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
    
    // 等待清理条件变量
    int res_join = pthread_join(tid, NULL);
    THREAD_ERROR_CHECK(res_join, "pthread_join");
    
    pthread_mutex_destroy(&lock);
    pthread_cond_destroy(&cond);
    return 0;
}


